package com.blog.cmrpersonalblog.service;

import com.blog.cmrpersonalblog.dto.ranking.respnose.HeatScoreInfo;

import java.time.LocalDateTime;

/**
 * 热度分数计算器接口
 */
public interface HeatScoreCalculator {
    
    /**
     * 计算文章热度分数
     *
     * @param viewCount 浏览量
     * @param likeCount 点赞数
     * @param collectCount 收藏数
     * @param commentCount 评论数
     * @param shareCount 分享数
     * @param publishTime 发布时间
     * @return 热度分数（整数）
     */
    Long calculateArticleHeatScore(
        Integer viewCount,
        Integer likeCount,
        Integer collectCount,
        Integer commentCount,
        Integer shareCount,
        LocalDateTime publishTime
    );
    
    /**
     * 计算文章热度分数（详细信息）
     * 
     * @param viewCount 浏览量
     * @param likeCount 点赞数
     * @param collectCount 收藏数
     * @param commentCount 评论数
     * @param shareCount 分享数
     * @param publishTime 发布时间
     * @return 热度分数详情
     */
    HeatScoreInfo calculateArticleHeatScoreDetail(
        Integer viewCount,
        Integer likeCount,
        Integer collectCount,
        Integer commentCount,
        Integer shareCount,
        LocalDateTime publishTime
    );
    
    /**
     * 计算作者影响力分数
     *
     * @param fansCount 粉丝数
     * @param articleCount 文章数
     * @param totalViewCount 总浏览量
     * @param totalLikeCount 总点赞数
     * @param totalCollectCount 总收藏数
     * @return 影响力分数（整数）
     */
    Long calculateAuthorInfluenceScore(
        Integer fansCount,
        Integer articleCount,
        Integer totalViewCount,
        Integer totalLikeCount,
        Integer totalCollectCount
    );
    
    /**
     * 计算作者影响力分数（详细信息）
     * 
     * @param fansCount 粉丝数
     * @param articleCount 文章数
     * @param totalViewCount 总浏览量
     * @param totalLikeCount 总点赞数
     * @param totalCollectCount 总收藏数
     * @return 影响力分数详情
     */
    HeatScoreInfo calculateAuthorInfluenceScoreDetail(
        Integer fansCount,
        Integer articleCount,
        Integer totalViewCount,
        Integer totalLikeCount,
        Integer totalCollectCount
    );
    
    /**
     * 计算时间衰减系数
     * 
     * @param publishTime 发布时间
     * @return 时间衰减系数（0-1之间）
     */
    Double calculateTimeDecayFactor(LocalDateTime publishTime);
}

